﻿// ***********************************************************************
// Assembly         : Delta_bussines
// Author           : Juan Alberto Cerino Gomez
// Created          : 02-18-2013
//
// Last Modified By : Juan Alberto Cerino Gomez
// Last Modified On : 06-03-2013
// ***********************************************************************
// <copyright file="PerDatosDinamicos.cs" company="Delta Bussines">
//     Copyright (c) 2013  Delta Bussines. All rights reserved.
// </copyright>
// <summary></summary>
// ***********************************************************************
using System;
using Delta_entidad.EntidadesControl;
using Delta_util.Estaticos;
using Delta_util.Clases;
using Delta_entidad.Atributos;

namespace Delta_bussines.PersistenciaControl
{
    /// <summary>
    /// Persistencia que se encarga de controlar la información de la configuración dinámica de un tipo general.
    /// </summary>
    public class PerDatosDinamicos : Base.PerConfig<Cat_tipo_gral>
    {

        /// <summary>
        /// Metodo que se encarga de importar los campos de una tabla y crear la configuración dinámica basica para estos campos.
        /// </summary>
        /// <param name="tipo_gral">Clave del tipo general al cual se le van a importar las columnas..</param>
        /// <param name="perPrimaria">Persistencia de la cual se quiere heredar la conexión y transacción, este parametro es opcional.</param>
        public void ImportarDatosDeTabla(int tipo_gral, object perPrimaria = null)
        {

            try
            {

                Cat_tipo_gral dato = null;
                if (perPrimaria != null)
                    HeredarConexionTransaccionDe(perPrimaria);
                else
                    ObtenerConexion();


                ConfigurarComando("DG_Cat_campo_tecnico_ImportarTabla", System.Data.CommandType.StoredProcedure); //configur
                AgregarParametro("@id_tipo_gral", System.Data.SqlDbType.Int, tipo_gral, 4);

                EjecutarQuery();
            }
            catch (Exception ex)
            {
                LiberarLector(dr);
                if (PuedeFinalizarConexionAut)
                    LiberarConexion();


            }


        }

        /// <summary>
        /// Metodo que se encarga de obtener la configuración dinámica de un tipo de dato.
        /// </summary>
        /// <param name="tipo">Tipo de dato de la entidad de la cual se quiere obtener la configuración dinámica.</param>
        /// <param name="id_tipo_gral">Clave del tipo general del cual se quiere obtener la configuración dinámica.</param>
        /// <param name="perPrimaria">Persistencia de la cual se quiere heredar la conexión y transacción, este parametro es opcional.</param>
        /// <returns>Entidad que contiene la configuración dinámica del tipo de la entidad.</returns>
        public Cat_tipo_gral ObtenerCamposUserTipo(Type tipo, int? id_tipo_gral = null, object perPrimaria = null)
        {

            try
            {

                Cat_tipo_gral dato = null;
                if (perPrimaria != null)
                    HeredarConexionTransaccionDe(perPrimaria);
                else
                    ObtenerConexion();

                AplicarProcesosDefault();
                ConfigurarComando(querys[Enumerados.TIPO_QUERY.OBTENER]);
                if (tipo != null)
                    AgregarParametro("@tipoEntidad", System.Data.SqlDbType.VarChar, tipo.FullName, 200);
                AgregarParametro("@id_tipo_gral", System.Data.SqlDbType.SmallInt, id_tipo_gral, 2);

                dr = EjecutarReader();
                if (dr.Read())
                {
                    dato = (CrearEntidadBase(dr));

                }
                if (dato != null)
                {
                    //Aqui se obtienen los campos del tipo
                    Base.PerConfig<Cat_campo_tecnico> perCampos = new Base.PerConfig<Cat_campo_tecnico>();
                    Base.PerConfig<Cat_tipo_columna> pertipo = new Base.PerConfig<Cat_tipo_columna>();
                    Base.PerConfig<Cat_editor> pereditor = new Base.PerConfig<Cat_editor>();
                    Base.PerConfig<Cat_filtro_campo> perFiltro = new Base.PerConfig<Cat_filtro_campo>();
                    Base.PerConfig<Operaciones_tipo> perOperaciones = new Base.PerConfig<Operaciones_tipo>();


                    perCampos.HeredarConexionTransaccionDe(this);
                    pertipo.HeredarConexionTransaccionDe(this);
                    pereditor.HeredarConexionTransaccionDe(this);
                    perFiltro.HeredarConexionTransaccionDe(this);
                    perOperaciones.HeredarConexionTransaccionDe(this);

                    Delta_entidad.Base.TipoBase tipoDato = null;
                    if (tipo != null)
                        tipoDato = (Delta_entidad.Base.TipoBase)Comun.CrearInstancia(tipo);
                    else
                        tipoDato = (Delta_entidad.Base.TipoBase)Comun.CrearInstancia(dato.tipoEntidad);
                    AttEntidad datosEntidad = Utilerias.ObtenerAtributoPropiedad<AttEntidad>(tipoDato.GetType());
                    bool obtenerUsers = (datosEntidad != null && datosEntidad.manejarDataUsers) || (dato.manejar_users && dato.configuracion_web);
                    if (obtenerUsers || (dato.configuracion_web && !tipoDato.EsEntidadControl))
                        dato.campos = perCampos.ObtenerVarios(new Cat_campo_tecnico { id_tipo_gral = dato.id_tipo_gral }, null);
                    else
                        dato.campos = new System.Collections.Generic.List<Cat_campo_tecnico>();
                    foreach (Cat_campo_tecnico campo in dato.campos)
                    {
                        campo.tipo = pertipo.Obtener(new Cat_tipo_columna { id_tipo_columna = campo.id_tipo_columna }, null);
                        campo.tipo_editor = pereditor.Obtener(new Cat_editor { id_editor = campo.tipo.id_editor });
                        if (campo.id_cat_filtro_campo > 0)
                        {
                            campo.filtro = perFiltro.Obtener(new Cat_filtro_campo() { id_cat_filtro_campo = campo.id_cat_filtro_campo });
                            if (campo.filtro != null)
                                campo.editorFiltro = pereditor.Obtener(new Cat_editor { id_editor = campo.filtro.id_editor });
                        }
                    }

                    dato.operaciones = perOperaciones.ObtenerVarios(new Operaciones_tipo() { id_tipo_gral = (Int16)dato.id_tipo_gral });
                }
                return dato;

            }
            catch (Exception ex)
            {
                LiberarLector(dr);
                if (PuedeFinalizarConexionAut)
                    LiberarConexion();
                return null;

            }


        }

    }
}
